﻿#include "SearchTab.h"
#include "ui_SearchTab.h"
#include <QMessageBox>
#include "Manager/HttpClientManager.h"
SearchTab::SearchTab(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::SearchTab)
{
    ui->setupUi(this);
    ui->fm_lend->setVisible(false);
    ui->fm_return->setVisible(false);

    loadSearchTableHeader();
    loadCmdTableHeader();
    //点击可以弹出日历
    ui->de_returndate->setCalendarPopup(true);
}

SearchTab::~SearchTab()
{
    delete ui;
}
/***************************************************************
* 函数名称：loadSearchTableHeader
* 功能描述：加载搜索档案列表的表头并设置属性
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::loadSearchTableHeader()
{
    ui->tb_searchresult->setModel(&mSearchModel);
    ui->tb_searchresult->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tb_searchresult->horizontalHeader()->setStretchLastSection(true);
    mSearchModel.setHorizontalHeaderLabels({"名称","编号","标签","位置","状态","籍贯","接收日期","档案等级"});
    //设置只能选中一行
    ui->tb_searchresult->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
    ui->tb_searchresult->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
}
/***************************************************************
* 函数名称：loadCmdTableHeader
* 功能描述：加载业务指令列表的表头并设置属性
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::loadCmdTableHeader()
{
    ui->tb_cmd->setModel(&mCmdModel);
    ui->tb_cmd->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tb_cmd->horizontalHeader()->setStretchLastSection(true);
    mCmdModel.setHorizontalHeaderLabels({"指令类型","名称","编号","标签","位置","状态","业务人","借阅时间","归还时间","档案等级"});
    //设置只能选中一行
    ui->tb_cmd->setSelectionBehavior(QAbstractItemView::SelectionBehavior::SelectRows);
    ui->tb_cmd->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection);
}
/***************************************************************
* 函数名称：on_btn_lend_clicked
* 功能描述：记录选中的档案并弹出借阅登记的frame并提前设置某些填写框信息
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::on_btn_lend_clicked()
{
    //先判断有没有选择目标档案
    QItemSelectionModel *pSelectedModel = ui->tb_searchresult->selectionModel();
    if(pSelectedModel == nullptr || !pSelectedModel->hasSelection())
    {
        QMessageBox msgBox;
        msgBox.setText("没有选择目标操作档案！");
        msgBox.exec();
        return;
    }
    selectRow = pSelectedModel->selectedRows(0).at(0).row();    //记录选中的行，防止在填写业务信息时重新点击列表导致选中的业务对象变更
    ui->fm_lend->setVisible(true);

    //归还时间默认一周后
    QDate currentDate = QDate::currentDate();          // 获取当前日期
    QDate nextWeekDate = currentDate.addDays(7);       // 获取当前日期的一周后的日期
    ui->de_returndate->setDate(nextWeekDate);          // 设置QDateEdit控件的日期为一周后的日期

}
/***************************************************************
* 函数名称：on_btn_lend_clicked
* 功能描述：记录选中的档案并弹出归还登记的frame
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::on_btn_return_clicked()
{
    //先判断有没有选择目标档案
    QItemSelectionModel *pSelectedModel = ui->tb_searchresult->selectionModel();
    if(pSelectedModel == nullptr || !pSelectedModel->hasSelection())
    {
        QMessageBox msgBox;
        msgBox.setText("没有选择目标操作档案！");
        msgBox.exec();
        return;
    }
    selectRow = pSelectedModel->selectedRows(0).at(0).row();    //记录选中的行，防止在填写业务信息时重新点击列表导致选中的业务对象变更
    ui->fm_return->setVisible(true);
}

void SearchTab::on_btn_search_clicked()
{
    if(ui->ip_searchtext->text().isEmpty())
    {
        QMessageBox msgBox;
        msgBox.setText("请输入搜索内容！");
        msgBox.exec();
        return;
    }
    //http的query参数
    QVariantMap params;
    params.insert("searchType",1);//ui->cb_field->currentIndex()
    params.insert("searchInfo",1);//ui->ip_searchtext->text()
    params.insert("pageIndex",1);
    params.insert("pageSIze",10);

    lastSearchText = ui->ip_searchtext->text();

    emit sig_sendSearchPost(params);
}
/***************************************************************
* 函数名称：slot_SearchInfoReceived
* 功能描述：解析查询档案的回复信息并将信息显示到查询列表中
* 参数说明：data-档案信息
* 返回值说明：
***************************************************************/
void SearchTab::slot_SearchInfoReceived(PagedResultDto<DevArvData> data)
{
    //从末尾开始删除
    for(int i = (mSearchModel.rowCount()-1); i>=0; i--)
    {
        mSearchModel.removeRow(i);
    }
    totalPages = data.totalPages;
    currentPage = data.currentPage;

    ui->lb_searchcount->setText(QString("共%1条%2页数据                      第%3页")
                                .arg(data.totalCount)
                                .arg(totalPages)
                                .arg(currentPage));

    if(data.totalCount == 0)
    {
        //cout<<TR("查询结果为空");
        return;
    }
    foreach(DevArvData arv, data.data)
    {
        QList<QStandardItem*> row;
        row.append(new QStandardItem(QString::fromStdString(arv.name)));    //名称
        row.append(new QStandardItem(QString::fromStdString(arv.cardID)));  //编号
        row.append(new QStandardItem(QString::fromStdString(arv.rfidLabel)));   //标签
        row.append(new QStandardItem(QString::fromStdString(arv.homeTown)));    //籍贯
        QString position = QString::number(arv.layerNo)+"层"+QString::number(arv.cellNo)+"格";//arv.Face+"面"+
        row.append(new QStandardItem(position));    //位置
        row.append(new QStandardItem(QString::fromStdString(arv.status)));  //状态
        row.append(new QStandardItem(QString::fromStdString(arv.receiptDate))); //接收日期
        row.append(new QStandardItem(QString::number(arv.arvLevel)));   //档案等级
        // 在最后一行插入新数据
        mSearchModel.insertRow(mSearchModel.rowCount(), row);
    }
    //更新搜索结果列表
    mSearchResult.clear();
    mSearchResult = data.data;
    ui->tb_searchresult->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
}

void SearchTab::on_btn_prepage_clicked()
{
    if(currentPage - 1 <= 0)
        return;

    QVariantMap SearchRequst;
    SearchRequst.insert("searchType",lastKeyWord);
    SearchRequst.insert("searchInfo",lastSearchText);
    SearchRequst.insert("pageIndex",currentPage-1);
    SearchRequst.insert("pageSIze",10);
    emit sig_sendSearchPost(SearchRequst);

}

void SearchTab::on_btn_nextpage_clicked()
{
    if(currentPage + 1>totalPages)
        return;

    QVariantMap SearchRequst;
    SearchRequst.insert("searchType",lastKeyWord);
    SearchRequst.insert("searchInfo",lastSearchText);
    SearchRequst.insert("pageIndex",currentPage+1);
    SearchRequst.insert("pageSIze",10);
    emit sig_sendSearchPost(SearchRequst);
}
/***************************************************************
* 函数名称：on_btn_lendadd_clicked
* 功能描述：将借阅登记的信息添加到业务指令列表中，并填写相关的类信息
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::on_btn_lendadd_clicked()
{
    if(ui->ip_lender->text().isEmpty())
    {
        QMessageBox msgBox;
        msgBox.setText("请填写借阅人！");
        msgBox.exec();
        return;
    }

    //业务指令列表显示
    QList<QStandardItem*> row;
    row.append(new QStandardItem("出柜"));    //指令类型
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].name)));   //名称
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].cardID))); //编号
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].rfidLabel)));  //标签
    QString str = QString("%1层%格").arg(mSearchResult[selectRow].layerNo).arg(mSearchResult[selectRow].cellNo);
    row.append(new QStandardItem(str));     //位置
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].status))); //状态
    row.append(new QStandardItem(ui->ip_lender->text()));   //借阅人
    row.append(new QStandardItem(QDateTime::currentDateTime().toString())); //借阅时间
    row.append(new QStandardItem(ui->de_returndate->text()));   //归还时间
    row.append(new QStandardItem(QString::number(mSearchResult[selectRow].arvLevel)));  //档案等级
    // 在最后一行插入新数据
    mCmdModel.insertRow(mCmdModel.rowCount(), row);

    //填充进指令列表
    SearchCmdModel cmd;
    //出入柜指令部分信息
    cmd.CmdType = "OUT_CAB";    //指令类型
    cmd.Name = QString::fromStdString(mSearchResult[selectRow].name);   //名称
    cmd.CardID = QString::fromStdString(mSearchResult[selectRow].cardID);   //编号
    cmd.Face = QString::fromStdString(mSearchResult[selectRow].face);   //存储面
    cmd.LayerNo = mSearchResult[selectRow].layerNo; //层
    cmd.CellNo = mSearchResult[selectRow].cellNo;   //格
    cmd.Standard = mSearchResult[selectRow].standard;   //规格
    cmd.QRCode = QString::fromStdString(mSearchResult[selectRow].qrCode);   //二维码
    //借阅post部分信息
    cmd.serviceType = "Lend";   //业务类型
    cmd.name = ui->ip_lender->text().toStdString(); //借阅人
    cmd.dept = ui->ip_lenddept->text().toStdString();   //借阅人部门
    cmd.executor = "123";   //执行人
    cmd.returnDeadline = ui->de_returndate->text().toStdString();   //归还时间

    if(mSearchResult[selectRow].arvLevel == ArvLevel::FirstLevel)
    {
        //一级档案
        cmd.arvID.push_back(mSearchResult[selectRow].id);
    }
    else if(mSearchResult[selectRow].arvLevel == ArvLevel::SecondLevel)
    {
        //二级档案
        cmd.arvID.push_back(mSearchResult[selectRow].mainArvId);
        cmd.childArvId.push_back(mSearchResult[selectRow].id);
    }
    else if(mSearchResult[selectRow].arvLevel == ArvLevel::ThirdLevel)
    {
        //三级档案
        cmd.arvID.push_back(mSearchResult[selectRow].mainArvId);
        cmd.grandChildArvId.push_back(mSearchResult[selectRow].id);
    }
    mSearchCmdList.append(cmd);
}
/***************************************************************
* 函数名称：on_btn_returnadd_clicked
* 功能描述：将归还登记的信息添加到业务指令列表中，并填写相关的类信息
* 参数说明：
* 返回值说明：
***************************************************************/
void SearchTab::on_btn_returnadd_clicked()
{
    if(ui->ip_returner->text().isEmpty())
    {
        QMessageBox msgBox;
        msgBox.setText("请填写归还人！");
        msgBox.exec();
        return;
    }
    QList<QStandardItem*> row;
    row.append(new QStandardItem("入柜"));    //指令类型
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].name)));   //名称
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].cardID))); //编号
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].rfidLabel)));  //标签
    QString str = QString("%1层%格").arg(mSearchResult[selectRow].layerNo).arg(mSearchResult[selectRow].cellNo);
    row.append(new QStandardItem(str));     //位置
    row.append(new QStandardItem(QString::fromStdString(mSearchResult[selectRow].status)));     //状态
    row.append(new QStandardItem(ui->ip_returner->text())); //归还人
    row.append(new QStandardItem(""));
    row.append(new QStandardItem(ui->ip_returnerdept->text()));     //归还部门
    row.append(new QStandardItem(QString::number(mSearchResult[selectRow].arvLevel)));  //档案等级
    // 在最后一行插入新数据
    mCmdModel.insertRow(mCmdModel.rowCount(), row);

    //填充进指令列表
    SearchCmdModel cmd;
    //出入柜指令部分信息 入柜指令不使用上位机的位置信息，需要重新分配货位，如果修改此部分逻辑，记得修改调度核中正常解析出入柜指令函数
    cmd.CmdType = "ENTER_CAB";  //指令类型
    cmd.Name = QString::fromStdString(mSearchResult[selectRow].name);   //名称
    cmd.CardID = QString::fromStdString(mSearchResult[selectRow].cardID);   //编号
    cmd.Face = QString::fromStdString(mSearchResult[selectRow].face);   //存储面
    cmd.Standard = mSearchResult[selectRow].standard;   //规格
    //借阅post部分信息
    cmd.serviceType = "Return";      //业务类型
    cmd.name = ui->ip_returner->text().toStdString();   //归还人
    cmd.dept = ui->ip_returnerdept->text().toStdString();   //归还人部门
    cmd.executor = "123";   //执行人

    if(mSearchResult[selectRow].arvLevel == ArvLevel::FirstLevel)
    {
        //一级档案
        cmd.arvID.push_back(mSearchResult[selectRow].id);
    }
    else if(mSearchResult[selectRow].arvLevel == ArvLevel::SecondLevel)
    {
        //二级档案
        cmd.arvID.push_back(mSearchResult[selectRow].mainArvId);
        cmd.childArvId.push_back(mSearchResult[selectRow].id);
    }
    else if(mSearchResult[selectRow].arvLevel == ArvLevel::ThirdLevel)
    {
        //三级档案
        cmd.arvID.push_back(mSearchResult[selectRow].mainArvId);
        cmd.grandChildArvId.push_back(mSearchResult[selectRow].id);
    }
    mSearchCmdList.append(cmd);
}

void SearchTab::on_btn_cmddelete_clicked()
{
    //先判断有没有选择目标档案
    QItemSelectionModel *pSelectedModel = ui->tb_cmd->selectionModel();
    if(pSelectedModel == nullptr || !pSelectedModel->hasSelection())
    {
        QMessageBox msgBox;
        msgBox.setText("没有选择目标操作档案！");
        msgBox.exec();
        return;
    }
    int Index = pSelectedModel->selectedRows(0).at(0).row();
    mCmdModel.removeRow(Index);
}

void SearchTab::on_btn_cmdclear_clicked()
{
    if(mCmdModel.rowCount() <= 0) return;

    // 从末尾开始删除
    for(int i = (mCmdModel.rowCount()-1); i>=0; i--)
    {
        mCmdModel.removeRow(i);
    }
}

void SearchTab::on_btn_confirm_clicked()
{
    if(mSearchCmdList.empty())
    {
        QMessageBox msgBox;
        msgBox.setText("目标档案列表为空！");
        msgBox.exec();
        return;
    }
    //验证身份,成功后修改所有的executor

    //发送到调度核处理将要添加的指令
    emit sig_addCmdFromPad(mSearchCmdList);
}
